// https://www.lintcode.com/problem/reverse-string/my-submissions

class Solution {
public:
    /**
     * @param s: a string
     * @return: return a string
     */
    string reverseString(string &s) {
        // 法一：双指针
        // int i = 0;
        // int j = s.size() - 1;
        // while (i < j) swap(s[i++], s[j--]);
        // // 注意转义
        // for( int i = 0; i < s.size();++i )
        // {
        //     if( s[i] == '\\' && i - 1 >= 0 )
        //     {
        //         swap(s[i], s[i - 1]);
        //     }
        // }
        // return s;
        
        // 法二：异或操作
    //     按位异或运算是指两个相应的二进制相同时结果为0，否则为1。
    //     若欲交换两个变量的值，而又不借助其他的中间变量，那么在C++中可以用下面的语句：
    //     a = a ^ b;  //语句1
    //     b = a ^ b;  //语句2
    //     a = b ^ a;  //语句3
    //     主要的原理是：
    // （1）一个变量按位异或自己的结果为0，即：a ^ a = 0；
    // （2）一个变量按位异或0的结果为自己，即：a ^ 0 = a；
    // 于是，在上面的三条语句中，语句1可以看做把变量a、b保存到a的存储空间中（当然这只是一种理解方式）；
    // 语句2消去了b（原理1），于是剩下了a（原理2），赋值到b的存储空间，此刻，b变量已经得到了a的值；
    // 语句3中，原本a变量存储空间内已经同时保存了a、b，此刻，b已经变成了a，所以两个按位异或后，
    // 便消去了a（原理1），只剩下了b（原理2），将它赋值给a，至此，交换变量的过程结束。
        int i = 0;
        int j = s.size() - 1;
        while (i < j)
        {
            s[i] = s[i] ^ s[j];
            s[j] = s[i] ^ s[j];
            s[i] = s[j] ^ s[i];
            i++;
            j--;
        }
        for( int i = 0; i < s.size();++i )
        {
            if( s[i] == '\\' && i - 1 >= 0 )
            {
                swap(s[i], s[i - 1]);
            }
        }
        return s;
    }
};